package com.example.websocket.sort;

import java.util.Arrays;

/**
 * 归并排序，使用分治法。
 * ------------------------------------------------------------------------
 * 每次合并操作的平均时间复杂度为O(n)，而完全二叉树的深度为|log2n|。
 * 总的平均时间复杂度为O(nlogn)。
 * 而且，归并排序的最好，最坏，平均时间复杂度均为O(nlogn)
 */
public class MergeSort {

    public void merge(int[] nums, int begin, int end) {
        if (end - begin < 1) {
            return;
        }
        int mid = (int) Math.floor((begin + end) / 2);
        merge(nums, begin, mid);
        merge(nums, mid + 1, end);

        int temp;
        // begin = 0, mid = 1, end = 3 [1, 3, 6, 5, 8, 7, 2, 4]
        // begin = 4, mid = 5, end = 7 [1, 3, 6, 5, 2, 4, 8, 7]
        // begin = 0, mid = 3, end = 7 [1, 2, 3, 4, 6, 5, 8, 7]
        while (begin <= mid && mid + 1 <= end) {
            if (nums[begin] >= nums[mid + 1]) {
                temp = nums[mid + 1];
                for (int i = mid; i >= begin; i--) {
                    nums[i + 1] = nums[i];
                }
                nums[begin] = temp;
                mid++;
            } else {
                begin++;
            }
        }
    }

    public static void main(String[] args) {
        int[] array = new int[]{6, 5, 3, 1, 8, 7, 2, 4};
        MergeSort m = new MergeSort();
        m.merge(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
    }
}
